home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1998-11-24 | 5.8 KB | 217 lines |
- ' ***************************************
- ' * *
- ' * Hunk Extract V1.1 gamma *
- ' * Written by Chris Hodges *
- ' * *
- ' ***************************************
- '
- Dim HL(100)
- P$=Command Line$
- Screen Open 0,640,256,2,$8000
- Curs Off
- Centre "Hunk Extract V1.1gamma" : Print
- Centre "Written by Chris Hodges" : Print : Print
- If P$=""
- Print "This tool enables you to rip memory banks out of compiled AMOS programs."
- Print "Currently it works with AMOS Creator and AMOS Professional executables,"
- Print "AMOS-squashed and unpacked. The only exception: old AMOS Creator Sprite banks"
- Print "can be saved, but cannot be reloaded into AMOS (so don't try to do that)."
- Print "I'll try to write a special save-routine for the next version."
- Print
- Print "Rip and enjoy.."
- Print
- Print "Press any key to continue..."
- Repeat
- I$=Inkey$ : Multi Wait
- Until I$<>""
- Cls
- End If
- Repeat
- Gosub RIPHUNKS
- Print String$("-",80);
- Print "Another file (Y/N)? ";
- Repeat
- I$=Upper$(Inkey$) : Multi Wait
- Until I$="N" or I$="Y"
- Print I$
- Until I$="N"
- End
- RIPHUNKS:
- If P$=""
- F$=Fsel$("","","Select an unpacked","AMOS executable")
- If F$="" : End : End If
- Else
- F$=P$ : P$=""
- End If
- If Exist(F$)=0 Then Print "File not found!" : Return
- Print "Loading: ";F$
- Extension_8_0456 F$,9
- ST=Start(9)
- If Leek(ST)<>$3F3 Then Print "Not an executable!" : Return
- Add ST,4
- While Leek(ST)
- Add ST,Leek(ST)*4+4
- Wend
- Add ST,4
- NH=Leek(ST)
- SH=Leek(ST+4)
- LH=Leek(ST+8)
- Add ST,12
- Print "Hunks:";NH
- Print "First:";SH
- Print "Last :";LH
- For A=SH To LH
- HL(A)=Leek(ST)*4 : Add ST,4
- Print "Hunk";A;" Length:";HL(A)
- Next
- For A=SH To LH
- HT=Leek(ST) and $FFFFFF : HL=Leek(ST+4)*4 : Add ST,8
- Print "Hunk";A;": ID=";Hex$(HT,8)
- If HL<>HL(A) Then Print "Error: Length error";HL;"<>";HL(A)
- If HT=$3EB Then HL=4
- If HT=$3E9 or HT=$3EA
- OST=ST : OHL=HL
- BN=Leek(ST) : ABN$=Peek$(ST+8,8)
- If BN= Extension_8_0998("xVdg")
- Gosub CRUNCHED
- BN=Leek(ST) : ABN$=Peek$(ST+8,8)
- End If
- If BN= Extension_8_0998("AmSp")
- Print String$("-",80);
- Print "Found AMOS Pro sprite bank"
- BN$="Sprites.abk"
- Gosub FSPRITE
- End If
- If BN= Extension_8_0998("AmIc")
- Print String$("-",80);
- Print "Found AMOS Pro icons bank"
- BN$="Icons.abk"
- Gosub FSPRITE
- End If
- FL=Deek(ST+4)
- For B=1 To 8
- P=Asc(Mid$(ABN$,B,1))
- Exit If P<32 or P>127
- Next
- If B=9
- If ABN$="Sprites " or ABN$="Icons "
- If ABN$="Sprites "
- Print String$("-",80);
- Print "Found AMOS Creator sprite bank"
- BN$="Sprites.abk" : ID$="AmSp"
- Else
- Print String$("-",80);
- Print "Found AMOS Creator icons bank"
- BN$="Icons.abk" : ID$="AmIc"
- End If
- Gosub FSPRITECREATOR
- Else
- If Abs((BN and $FFFFFFC)-HL)<17 and((FL and $FFFFFF)<17)
- BL=(BN and $FFFFFFC) : BN=(FL and $FFFFFFF)
- FL= Extension_8_093A(Peek(ST),6)
- Print String$("-",80);
- Print "Probably found bank: AMOS Creator"
- Gosub FBANK
- Print
- Else
- If(BN and $FFFFFFF)<$8000
- BL=HL-16 : BN=BN and $FFFFFFF
- Print String$("-",80);
- Print "Probably found bank: AMOS Pro"
- Gosub FBANK
- Print
- End If
- End If
- End If
- End If
- ST=OST : HL=OHL
- Add ST,HL
- Do
- HE=Leek(ST) : Add ST,4
- Exit If HE=$3F2
- If HE<$3EC or HE>$3EE
- Print "Warning: Unknown hunk ID=";Hex$(HE,8)
- Else
- Print "Warning: Hunk has reloc table (maybe not AMOS!)"
- End If
- Do
- AO=Leek(ST) : Add ST,4
- Exit If AO=0
- HN=Leek(ST) : Add ST,4+AO*4
- Loop
- Loop
- Else
- Add ST,HL
- End If
- Erase 10
- Next
- Erase 9
- Print "No more hunks in file."
- Return
- CRUNCHED:
- LP=Leek(ST+4)
- L=Leek(ST+8)
- Print "Hunk is squashed. Packed:";L;At(35,);"Unpacked:";LP;At(55,);"Rate:";100-((L*100)/LP);"%"
- Reserve As Work 10,LP
- Copy ST+12,ST+12+L To Start(10)
- ST=Start(10)
- X= Extension_5_00E4(ST,L)
- ' HL=(Leek(ST) and $FFFFFFC)+8
- HL=LP
- Return
- FSPRITE:
- Print "Images:";Deek(ST+4);
- If Deek(ST+4)=39 Then Print " (Probably mouse.abk)" Else Print
- Print "Save bank (Y/N)? ";
- Repeat
- I$=Upper$(Inkey$) : Multi Wait
- Until I$="N" or I$="Y"
- Print I$
- If I$="N" Then Return
- F$=Fsel$("",BN$,"Enter name for","the bank")
- If F$="" Then Return
- Print "Saving: ";F$
- Bsave F$,ST To ST+HL
- Return
- FSPRITECREATOR:
- Print "Images:";BN
- Print "Save bank (Y/N)? ";
- Repeat
- I$=Upper$(Inkey$) : Multi Wait
- Until I$="N" or I$="Y"
- Print I$
- If I$="N" Then Return
- F$=Fsel$("",BN$,"Enter name for","the bank")
- If F$="" Then Return
- Print "Saving: ";F$
- Open Out 1,F$
- Print #1,ID$;
- Extension_8_17B6 1,ST+16 To ST+HL
- Close 1
- Return
- FBANK:
- Print "Number:";BN
- Print "Flags : ";Hex$(FL,4)
- Print "Length:";BL
- Print "Name : ";ABN$
- Print "Save bank (Y/N)? ";
- Repeat
- I$=Upper$(Inkey$) : Multi Wait
- Until I$="N" or I$="Y"
- Print I$
- If I$="N" Then Return
- Print "Save as raw (Y/N)? ";
- Repeat
- I$=Upper$(Inkey$) : Multi Wait
- Until I$="N" or I$="Y"
- Print I$
- BN$="Bank"+Mid$(Str$(BN),2)
- If I$="N" Then BN$=BN$+".Abk"
- F$=Fsel$("",BN$,"Enter name for","Bank"+Str$(BN))
- If F$="" Then Return
- Print "Saving: ";F$
- Open Out 1,F$
- If I$="N" Then Print #1,"AmBk"+ Extension_8_08D2(BN)+ Extension_8_08D2(FL)+ Extension_8_08D2(BL+8)+ABN$;
- Extension_8_17B6 1,ST+16 To ST+BL+16
- Close 1
- Return